﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

namespace Newsql.Data.MongoDB
{
	/// <summary>
	/// 为具有自增标识符的实体对象的数据访问层提供基类。
	/// </summary>
	public abstract class AutoIncrementIdObjectDALBase<T, TId> : MongoDBDALBase<T, TId> where T : IDBObject<TId>
	                                                                                    where TId : BsonValue
	{
		/// <summary>
		/// 初始化 <see cref="MongoDBDALBase{T, TId}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">连接字符串。</param>
		protected AutoIncrementIdObjectDALBase(string masterGroup) : base(masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="MongoDBDALBase{T, TId}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected AutoIncrementIdObjectDALBase(string masterGroup, string slaveGroup) : base(masterGroup, slaveGroup) { }

		/// <summary>
		/// 获取或设置记录数据库自增标识的集合名称。
		/// </summary>
		protected virtual string AutoIncrementCollectionName { get { return "DbAutoIncrements"; } }

		/// <summary>
		/// 清除标识符记录。
		/// </summary>
		/// <param name="safeMode">指定安全操作模式。</param>
		/// <remarks>注意：请使用 <see cref="MongoDBDALBase{T,TId}.GetDatabase"/> 连接服务器。</remarks>
		public virtual SafeModeResult UnsetId(SafeMode safeMode = null)
		{
			if (safeMode == null) safeMode = SafeMode.True;

			var database = this.GetDatabase();
			var collectionName = this.GetCollectionName(this.AutoIncrementCollectionName);
			var collection = database.GetCollection(collectionName);

			return collection.Update(Query.EQ("_id", this.CollectionName), global::MongoDB.Driver.Builders.Update.Unset("Index"), safeMode);
		}

		/// <summary>
		/// 重置标识符记录。
		/// </summary>
		/// <param name="defaultValue">为标识符指定一个默认值。</param>
		/// <param name="safeMode">指定安全操作模式。</param>
		/// <remarks>注意：请使用 <see cref="MongoDBDALBase{T,TId}.GetDatabase"/> 连接服务器。</remarks>
		public virtual SafeModeResult ResetId(TId defaultValue, SafeMode safeMode = null)
		{
			if (safeMode == null) safeMode = SafeMode.True;

			var database = this.GetDatabase();
			var collectionName = this.GetCollectionName(this.AutoIncrementCollectionName);
			var collection = database.GetCollection(collectionName);

			return collection.Update(Query.EQ("_id", this.CollectionName), global::MongoDB.Driver.Builders.Update.Set("Index", defaultValue), safeMode);
		}
	}
}
